// package com.zjxh.zjxh.common.util;
//
// import cn.hutool.core.util.StrUtil;
// import com.aliyun.oss.ClientBuilderConfiguration;
// import com.aliyun.oss.ClientException;
// import com.aliyun.oss.OSS;
// import com.aliyun.oss.OSSClientBuilder;
// import com.aliyun.oss.OSSException;
// import com.aliyun.oss.internal.OSSHeaders;
// import com.aliyun.oss.model.CannedAccessControlList;
// import com.aliyun.oss.model.ObjectMetadata;
// import com.aliyun.oss.model.PutObjectRequest;
// import com.aliyun.oss.model.StorageClass;
// import java.io.File;
// import java.io.FileNotFoundException;
// import java.io.IOException;
// import java.io.InputStream;
// import lombok.Data;
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.beans.factory.annotation.Value;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.web.multipart.MultipartFile;
//
// /**
//  * @author: Zek
//  * @date: 2020/9/21 on 2:33 下午
//  * @desc: ⠀阿里云OSS对象存储工具类
//  */
// @Data
// @Slf4j
// @Configuration
// public class OSSClientUtil {
//
//   /** 阿里云API的密钥Access Key ID */
//   @Value("${aliyun.accessKeyId}")
//   private String accessKeyId;
//
//   /** 阿里云API的密钥Access Key Secret */
//   @Value("${aliyun.accessKeySecret}")
//   private String accessKeySecret;
//
//   /** 阿里云API的内或外网域名 */
//   @Value("${oss.endpoint}")
//   private String endpoint;
//
//   /** 阿里云API的bucket名称 */
//   @Value("${oss.bucketName}")
//   private String bucketName;
//
//   // /** url 过期时间 = 720 */
//   // @Value("${oss.img-url-expired-hours:720}")
//   // private long imgUrlExpiredHours;
//   //
//   // /** 支持的图片后缀 */
//   // @Value("${oss.img-suffix-types}")
//   // private List<String> imgSuffixTypes;
//   //
//   // /** 支持的音频后缀 */
//   // @Value("${oss.voice-suffix-types}")
//   // private List<String> voiceSuffixTypes;
//   //
//   // /** 支持的文件后缀 */
//   // @Value("${oss.file-suffix-types}")
//   // private List<String> fileSuffixTypes;
//   //
//   // /** 样式处理分割符 */
//   // @Value("${oss.img-style.split-sign:!}")
//   // private String imgStyleSplitSign;
//   //
//   // /** 缩放 */
//   // @Value("${oss.img-style.resize}")
//   // private String imgStyleResize;
//
//   private OSS getOSSClient() {
//     try {
//       // 设置超时机制和重试机制
//       ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
//       conf.setConnectionTimeout(5000);
//       conf.setMaxErrorRetry(3);
//       conf.setSupportCname(true);
//       return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, conf);
//     } catch (Exception e) {
//       log.error("阿里云OSS错误:获取OSS失败，请核查:", e);
//       throw new CommonException(CMEnum.ERROR_OSS);
//     }
//   }
//
//   /**
//    * 上传 MultipartFile 文件
//    *
//    * @param file 文件
//    */
//   public String multipartFileUpload(MultipartFile file, String fileKey) {
//     // if (FileUtil.isEmpty(file)) {
//     //   return null;
//     // }
//     // aaa.jpg
//     // String fileName = file.getOriginalFilename();
//     // if (StrUtil.isBlank(fileName)) {
//     //   throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//     // }
//     log.info("------------------------------开始上传文件：{}", fileKey);
//     // 比对文件名的，后缀，jpg,jpeg等
//     // checkFileSizeExtName(file.getSize(), typeEnum, fileName);
//     try {
//       return inputStreamUpload(file.getInputStream(), fileKey);
//     } catch (IOException e) {
//       log.error("上传文件异常：", e);
//       throw new CommonException(CMEnum.ERROR_OSS);
//     }
//   }
//
//   private String inputStreamUpload(InputStream stream, String fileKey) {
//     log.info("------------------------------开始上传文件：{}", fileKey);
//     OSS oss = getOSSClient();
//     try {
//
//       ObjectMetadata metadata = new ObjectMetadata();
//       // 处理图片不是直接显示问题
//       metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//       metadata.setObjectAcl(CannedAccessControlList.PublicRead);
//       metadata.setContentType("image/jpg");
//       oss.putObject(new PutObjectRequest(bucketName, fileKey, stream, metadata));
//     } catch (OSSException | ClientException e) {
//       log.error("上传文件异常：", e);
//       throw new CommonException(CMEnum.ERROR_OSS);
//     } finally {
//       oss.shutdown();
//     }
//     // 图片旋转问题
//     // ThreadUtil.execAsync(() -> asyncFunExif(fileKey));
//     return fileKey;
//   }
//
//   public void deleteFile(String fileKey) {
//     if (StrUtil.isBlankOrUndefined(fileKey)) {
//       return;
//     }
//     log.info("------------------------------开始删除文件：{}", fileKey);
//     // if (OSSEnum.map().containsValue(fileKey)) {
//     //   return;
//     // }
//     OSS oss = getOSSClient();
//     oss.deleteObject(bucketName, fileKey);
//     oss.shutdown();
//     // deleteRedisFileKey(fileKey);
//   }
//   // /**
//   //  * 校验后缀，以及，文件大小
//   //  *
//   //  * @param fileSize
//   //  * @param typeEnum
//   //  * @param fileName
//   //  */
//   // private void checkFileSizeExtName(Long fileSize, FileTypeEnum typeEnum, String fileName) {
//   //   String extName = cn.hutool.core.io.FileUtil.extName(fileName);
//   //   switch (typeEnum) {
//   //     case IMAGE:
//   //       if (!imgSuffixTypes.contains(extName)) {
//   //         throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//   //       }
//   //       if (!"pdf".equalsIgnoreCase(extName)
//   //           && !FileUtil.checkFileSize(fileSize, 5, Constant.FILE_SIZE_M_UNIT)) {
//   //         throw new CommonException(CMEnum.ERROR_OSS_FILE_SIZE);
//   //       }
//   //       break;
//   //     case VOICE:
//   //       if (!voiceSuffixTypes.contains(extName)) {
//   //         throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//   //       }
//   //       break;
//   //     case FILE:
//   //       if (!fileSuffixTypes.contains(extName)) {
//   //         throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//   //       }
//   //       break;
//   //     default:
//   //       throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//   //   }
//   // }
//
//   // public String inputStreamUpload(InputStream stream, FileEnum fileEnum, String todoId) {
//   //   if (stream == null) {
//   //     return null;
//   //   }
//   //   try {
//   //     if (stream.available() == Constant.INT_ZERO) {
//   //       return null;
//   //     }
//   //   } catch (IOException e) {
//   //     throw new CommonException(CMEnum.ERROR_OSS);
//   //   }
//   //   return inputStreamUpload(
//   //       stream, buildImpUri(fileEnum.name(), todoId, fileEnum.name() + ".png"));
//   // }
//   //
//   // public String pathFileUpload(
//   //     String path, FileEnum fileEnum, FileTypeEnum typeEnum, String todoId) {
//   //   if (StrUtil.isBlankOrUndefined(path)) {
//   //     return null;
//   //   }
//   //   // aaa.jpg
//   //   String fileName = path.substring(path.lastIndexOf("/") + 1);
//   //   if (StrUtil.isBlank(fileName)) {
//   //     throw new CommonException(CMEnum.ERROR_OSS_FILE_TYPE);
//   //   }
//   //   log.info("------------------------------开始上传文件：{}", fileName);
//   //   // 比对文件名的，后缀，jpg,jpeg等
//   //   checkFileSizeExtName(0L, typeEnum, fileName);
//   //   return inputStreamUpload(
//   //       cn.hutool.core.io.FileUtil.getInputStream(path),
//   //       buildImpUri(fileEnum.name(), todoId, fileName));
//   // }
//
//   // private void asyncFunExif(String key) {
//   //   // 图片但非PDF，则需要添加样式。
//   //   String extName = cn.hutool.core.io.FileUtil.extName(key);
//   //   if (imgSuffixTypes.contains(extName) && !"pdf".equalsIgnoreCase(extName)) {
//   //     OSS oss = getOSSClient();
//   //     try {
//   //       StringBuilder sbStyle = new StringBuilder();
//   //       Formatter styleFormatter = new Formatter(sbStyle);
//   //       // 将处理后的图片命名为example-resize.png并保存到当前Bucket。
//   //       // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
//   //       styleFormatter.format(
//   //           "%s|sys/saveas,o_%s,b_%s",
//   //           "image/auto-orient,1/quality,q_80",
//   //           BinaryUtil.toBase64String(key.getBytes()),
//   //           BinaryUtil.toBase64String(bucketName.getBytes()));
//   //       log.info("------------------------------异步处理图片旋转问题参数：{}", sbStyle);
//   //       ProcessObjectRequest request =
//   //           new ProcessObjectRequest(bucketName, key, sbStyle.toString());
//   //       GenericResult result = oss.processObject(request);
//   //       String json = IOUtils.readStreamAsString(result.getResponse().getContent(), "UTF-8");
//   //       result.getResponse().getContent().close();
//   //       log.info("------------------------------异步处理图片旋转问题结果：{}", json);
//   //     } catch (IOException e) {
//   //       e.printStackTrace();
//   //     } finally {
//   //       oss.shutdown();
//   //     }
//   //   }
//   // }
//
//   // /**
//   //  * 构造img图片key
//   //  *
//   //  * @param imgType 图片类型
//   //  * @param todoId 相关ID
//   //  * @param fileName 文件名字，比如abc
//   //  * @return 不能超过254长度
//   //  */
//   // private String buildImpUri(String imgType, String todoId, String fileName) {
//   //   // 图片类型/相关ID/时间+随机字符串/文件名称   -替换所有特殊字符
//   //   return imgType
//   //       + "/"
//   //       + todoId
//   //       + "/"
//   //       + LocalDate.now().format(Constant.YYYYMMDD)
//   //       + "/"
//   //       + RandomUtil.randomString(5)
//   //       + StrUtil.sub(
//   //           cn.hutool.core.io.FileUtil.mainName(fileName).replaceAll("[^0-9a-zA-Z一-龥]+", ""), 0,
//   // 10)
//   //       + StrUtil.C_DOT
//   //       + cn.hutool.core.io.FileUtil.extName(fileName);
//   // }
//
//   public static void main(String[] args) throws FileNotFoundException {
//
//     //
//     // File file = new File("D:\\line.png");
//     // InputStream inputStream = new FileInputStream(file);
//     // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
//     String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
//     // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
//     String accessKeyId = "LTAI5tHXYfefsSmqCTPRdTQc";
//     String accessKeySecret = "VrTgDP90BvWM1iAAMTa8blAnHBL1Wu";
//     // 填写Bucket名称，例如examplebucket。
//     String bucketName = "ydlxt";
//     // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
//     String objectName = "test/exampleobject.png";
//     // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
//     // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
//     String filePath = "D:\\line.png";
//
//     // 创建OSSClient实例。
//     OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//
//     try {
//       // 创建PutObjectRequest对象。
//       PutObjectRequest putObjectRequest =
//           new PutObjectRequest(bucketName, objectName, new File(filePath));
//       // 如果需要上传时设置存储类型和访问权限，请参考以下示例代码。
//       ObjectMetadata metadata = new ObjectMetadata();
//       metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//       metadata.setObjectAcl(CannedAccessControlList.PublicRead);
//       metadata.setContentType("image/jpg");
//       putObjectRequest.setMetadata(metadata);
//
//       // 上传文件。
//       ossClient.putObject(putObjectRequest);
//     } catch (OSSException oe) {
//       System.out.println(
//           "Caught an OSSException, which means your request made it to OSS, "
//               + "but was rejected with an error response for some reason.");
//       System.out.println("Error Message:" + oe.getErrorMessage());
//       System.out.println("Error Code:" + oe.getErrorCode());
//       System.out.println("Request ID:" + oe.getRequestId());
//       System.out.println("Host ID:" + oe.getHostId());
//     } catch (ClientException ce) {
//       System.out.println(
//           "Caught an ClientException, which means the client encountered "
//               + "a serious internal problem while trying to communicate with OSS, "
//               + "such as not being able to access the network.");
//       System.out.println("Error Message:" + ce.getMessage());
//     } finally {
//       if (ossClient != null) {
//         ossClient.shutdown();
//       }
//     }
//   }
// }
